﻿/* PCi DiRT 2 Bench Tool - Benchmark automation tool for DiRT 2
   Copyright © 2011, LEGRAND David
   Mail : david@pcinpact.com

   http://code.google.com/p/pci-gbs/

   This file is part of PCi DiRT 2 Bench Tool.

   PCi DiRT 2 Bench Tool is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   PCi DiRT 2 Bench Tool is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with PCi DiRT 2 Bench Tool.  If not, see <http://www.gnu.org/licenses/>.
 
   You're not allowed to use PC INpact name or logo without permission */

using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Windows.Forms;
using System.Management;

namespace PCi_GBS_DLL
{
    public class Tools_D2
    {
        // Fonction permettant de récupérer le répertoire depuis un string et le nom de l'exécutable
        public string Get_Folder(string exe, string path)
        {
            string folder = path.Substring(0, path.Length - exe.Length);
            return folder;
        }

        // Fonction permettant de récupérer le nom d'un exécutable depuis un string
        public string Get_EXE(string path)
        {
            string exe = path.Split('\\')[path.Split('\\').Length - 1];
            return exe;
        }

        // Fonction permettant d'aller à la fin d'une textbox
        public void Sortie_Bottom(TextBox tb)
        {
            tb.SelectionStart = tb.Text.Length;
            tb.ScrollToCaret();
        }

        public ManagementObjectCollection Get_Resolutions()
        {
            // On fait la liste des résolution supportées et on l'ajoute à une combobox
            var scope = new ManagementScope();
            var query = new ObjectQuery("SELECT * FROM CIM_VideoControllerResolution");

            var searcher = new ManagementObjectSearcher(scope, query);
            return searcher.Get();
        }

        // Fonction qui indique un message d'erreur et qui ferme l'application
        public void Error_Box()
        {
            // On affiche un message d'erreur et on quitte l'application
            MessageBox.Show("Error occured. Application will be closed", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            Environment.Exit(-1);
        }
    }

    public class Tools_AvP
    {
        // On transforme une suite de texte compréhensible en liste de paramètres
        public string human_to_param(string h)
        {
            // On sépare les grandes familles de paramètres
            string[] work_array = h.Split('-');

            // On recompose la donnée de paramètres
            string param = "";

            // on traite la résolution
            param = work_array[0].Trim().Replace('x', ',') + ",";

            // on traite la boucle
            param += work_array[2].Trim().Replace("x", "") + ",";

            // On traite les paramètres
            string[] param_array = work_array[1].Trim().Replace(" ", "").Split('/');

            param += param_array[0].Replace("T", "") + ",";
            param += param_array[1].Replace("S", "") + ",";

            // Dans le cas de l'AF, il faut gérer l'obligation d'avoir deux caractères
            param_array[2] = param_array[2].Replace("AF", "").Replace("x", "");
            if (param_array[2].Length < 2) param_array[2] = param_array[2].Insert(0, "0");
            param += param_array[2] + ",";

            // On créé le tableau nous servant pour les paramètres avancés
            string[] param_adv = { "0,", "0,", "0," };

            // Si l'on a des paramètres avancés
            if (param_array.Length > 4)
            {
                // Pour chacun d'entre eux
                for (int i = 0; i < param_array.Length - 4; i++)
                {
                    // On vérifie le paramètre activé, et l'on passe la valeur adéquate à 1
                    if (param_array[4 + i].Trim() == "SSAO") param_adv[0] = "1,";
                    if (param_array[4 + i].Trim() == "Tessellation") param_adv[1] = "1,";
                    if (param_array[4 + i].Trim() == "Adv.shadowsampling") param_adv[2] = "1,";
                }
            }

            // On rajoute le contenu du tableau des paramètres avancés
            foreach (string v in param_adv)
            {
                param += v;
            }

            // On termine par la valeur de l'AA
            param += param_array[3].Replace("AA", "").Replace("x", "");

            return param;
        }

        // On transforme une liste de paramètres en suite de texte compréhensible
        public string param_to_human(string p)
        {
            string s = "";

            if (p.Length == 8)
            {
                string[] work_array = { p.Substring(0, 1), p.Substring(1, 1), p.Substring(2, 2), p.Substring(4, 1), p.Substring(5, 1), p.Substring(6, 1), p.Substring(7, 1) };

                s += "T" + work_array[0] + " / ";
                s += "S" + work_array[1] + " / ";
                s += "AF ";

                if (work_array[2].Substring(0, 1) == "0") work_array[2] = work_array[2].Remove(0, 1);

                s += work_array[2] + "x / ";

                if (work_array[3] == "1") s += "SSAO / ";
                if (work_array[4] == "1") s += "Tessellation / ";
                if (work_array[5] == "1") s += "Adv. shadow sampling / ";

                s += "AA " + work_array[6] + "x";

                return s;
            }
            else return p;
        }

        // Fonction permettant de récupérer le répertoire depuis un string et le nom de l'exécutable
        public string Get_Folder(string exe, string path)
        {
            string folder = path.Substring(0, path.Length - exe.Length);
            return folder;
        }

        // Fonction permettant de récupérer le nom d'un exécutable depuis un string
        public string Get_EXE(string path)
        {
            string exe = path.Split('\\')[path.Split('\\').Length - 1];
            return exe;
        }

        // Fonction permettant d'aller à la fin d'une textbox
        public void Sortie_Bottom(TextBox tb)
        {
            tb.SelectionStart = tb.Text.Length;
            tb.ScrollToCaret();
        }

        public ManagementObjectCollection Get_Resolutions()
        {
            // On fait la liste des résolution supportées et on l'ajoute à une combobox
            var scope = new ManagementScope();
            var query = new ObjectQuery("SELECT * FROM CIM_VideoControllerResolution");

            var searcher = new ManagementObjectSearcher(scope, query);
            return searcher.Get();
        }

        // Fonction qui indique un message d'erreur et qui ferme l'application
        public void Error_Box()
        {
            // On affiche un message d'erreur et on quitte l'application
            MessageBox.Show("Error occured. Application will be closed", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            Environment.Exit(-1);
        }
    }
}
